动态性(Dynamic)
-
动态类型- 指的是对象指针类型的动态性、具体是指使用id任意类型将对象的类型确定推迟到运行时
- 动态类型识别 isKindOfClass
-
动态绑定- 核心是在运行时动态的为类添加属性和方法
- 消息传递机制
-
动态加载- 动态资源加载
- 可执行代码模块的加载
成员变量和属性
属性:成员变量+setter+getter
Category(类别/分类/类目)
应用场景
- 多人维护同一个类
- 为已经存在的类添加方法
- 声明私有方法
- 模拟多继承
- 把frameowork的私有方法公开
注意
- 分类只能添加方法 不能增加成员变量
- 分类同名的方法会覆盖原来的方法(原来的方法还有只是在顺序列表的后面)
- 分类方法中不可以调用super
- 相同方法的优先级 分类(最后编译的分类优先)-> 原类 -> 父类
- 分类是runtime时加载 不是编译时
- 分类可通过runtime 关联对象 添加属性(类别中添加@property描述的属性,(只会生成这个属性的set,get方法的声明,也就不是会实现.)这时候编译是没问题的没警告没报错,但是一旦在创建对象后为属性赋值或者使用这个属性的时候,程序就崩溃了,奔溃的原因也很简单,就是找不到属性的set/get方法)
Extension(扩展)
- 为一个类添加额外的原来没有变量,方法和属性
- 一般的类扩展写到.m文件中
- 一般的私有属性写到.m文件中的类扩展中
Category 和 Extension 区别
- Class Extension 在编译期就会将定义的 Ivar、属性、方法等直接合入主类,而 Category 在程序启动 Runtime Loading 时才会将属性(没 Ivar)和方法合入主类
- Class Extension 是匿名的 Category
- 主要的区别在于,对于扩展,编译器将期望您在主@implementation中实现方法,而对于类别,您有一个单独的@implementation块
Delegate
使用weak 防止循环引用
NSNotification
观察者模式
KVO(Key-value observing)
观察者模式
实现原理
Apple 使用了 isa 混写(isa-swizzling)来实现 KVO 。当观察对象A时,KVO机制动态创建一个新的名为:NSKVONotifying_A 的派生类,并将被观察对象的isa 指向这个派生类,该类继承自对象A的本类,且 KVO 为 NSKVONotifying_A 重写观察属性的 setter 方法,setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象属性值的更改情况。
(备注: isa 混写(isa-swizzling)isa:is a kind of ; swizzling:混合,搅合;)
注意
必须继承NSObject 因为NSObject可监听值的变化 NSKeyValueObserving
KVC(Key-value Coding)
- 动态set、get
- 访问私有属性
- KVC和Objc的runtime组合可以很容易的实现Model和字典的转换
- KVO是基于KVC实现的